load("/lustre/scratch117/cellgen/team218/gp7/Joe/Jupyter/PAGA.rda")
cannot open compressed file '/lustre/scratch117/cellgen/team218/gp7/Joe/Jupyter/PAGA.rda', probable reason 'No such file or directory'Error in readChar(con, 5L, useBytes = TRUE) : cannot open the connection
load("/lustre/scratch117/cellgen/team218/gp7/Joe/Jupyter/PAGA.rda")
cannot open compressed file '/lustre/scratch117/cellgen/team218/gp7/Joe/Jupyter/PAGA.rda', probable reason 'No such file or directory'Error in readChar(con, 5L, useBytes = TRUE) : cannot open the connection
library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.0 using 30 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: ‘data.table’

The following object is masked _by_ ‘.GlobalEnv’:

    .N
library(tseries)
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 

    ‘tseries’ version: 0.10-48

    ‘tseries’ is a package for time series analysis and computational finance.

    See ‘library(help="tseries")’ for details.
library(ggplot2)
PAGA_graph_connectivities <- read.matrix("/lustre/scratch117/cellgen/team218/gp7/Joe/PAGA", header = T, sep = ",")
cannot open file '/lustre/scratch117/cellgen/team218/gp7/Joe/PAGA': No such file or directoryError in count.fields(file, sep = sep, skip = skip) : 
  cannot open the connection
save(/lustre/scratch117/cellgen/team218/gp7/Joe/PAGA/)


node = "9:67029664-67029742"


ggplot() +
  geom_point(data=PAGA, aes(FA1, FA2), colour="grey", alpha=0.05) +
  geom_point(data=pseudopool_matrix.PAGA[Coord==node, ], aes(FA1, FA2, colour=PSI, size=log(SN_Reads) ), alpha=0.5 ) +
   scale_colour_gradient2(low = "steelblue", midpoint = 0.5, mid = "lightskyblue3", high = "firebrick", na.value = "gray40") +
  theme_bw() +
  theme(legend.position = "top")
PAGA_graph_connectivities.melted$value <- as.numeric(as.character(PAGA_graph_connectivities.melted$value))

PAGA_graph_connectivities.melted[value==0, ]

is.data.table(PAGA_graph_connectivities.melted)
node="15:77091812-77091854"
edges <- merge(PAGA_net[ , .(Var1=as.character(Var1), Var2=as.character(Var2), value)], vert, by.x='Var1', by.y='cluster')
Error in is.data.table(y) : object 'vert' not found

layout.fruchterman.reingold
function (..., params = list()) 
{
    do_call(layout_with_fr, .args = c(list(...), params))
}
<bytecode: 0x55e467194978>
<environment: namespace:igraph>

General view

Warning message:
In readChar(file, size, TRUE) : truncating string with embedded nuls
ggplot(pseudopool_matrix.zscore.PAGA[Coord==node, ]) +
        geom_point(aes(FA1, FA2, colour=cluster, size=log(n_cells)), position = position_jitter(w = 3e3, h = 3e3), alpha=0.5 ) +
                theme_bw() +
     #scale_colour_gradient2(low = "steelblue", midpoint = 0.5, mid = "lightskyblue3", high = "firebrick", na.value = "gray40") +
        theme(legend.position = "none") 

library("ggrepel")

ggplot() +
  
        geom_point(data=PAGA, aes(FA1, FA2, colour=batch), alpha=0.2) +
  #      geom_point(data=pseudopool_matrix.zscore.PAGA[Coord==node, ], aes(FA1, FA2, colour=PSI, size=log(n_cells)), position = position_jitter(w = 2e3, h = 2e3), alpha=0.5 ) +
                theme_bw() +
  #   scale_colour_gradient2(low = "steelblue", midpoint = 0.5, mid = "lightskyblue3", high = "firebrick", na.value = "gray40") +
        theme(legend.position = "top") 

total_genes.gene_table <- data.table(getBM(attributes=c('ensembl_gene_id', "mgi_symbol"),filters = 'ensembl_gene_id', values = total_genes , mart = ensembl_mm))
Error in getBM(attributes = c("ensembl_gene_id", "mgi_symbol"), filters = "ensembl_gene_id",  : 
  object 'total_genes' not found
#Good
#Elavl2
#Msi1

#Bad
#Ptbp2

gene_vector <- c("Mbnl1", "Elavl2", "Rbfox2", "Rbm24", "Msi1", "Esrp1")
#gene_vector <- c("Elavl2", "Celf4", "Msi1", "Srrm4", "Elavl3", "Elavl1")


#gene_vector <- c("Mbnl1", "Ptbp2", "Rbfox2", "Rbm24", "Ptbp3", "Esrp1")

PAGA.genes <- merge( gene_count[mgi_symbol %in%  gene_vector,] , PAGA[ ,.(cell=V1, FA1, FA2)], by="cell", all.y=T  )

#PAGA.genes$cell <- factor( PAGA.genes$cell, levels= PAGA.genes[order(TpM)]$cell)


ggplot() +
        geom_point(data=PAGA, aes(FA1, FA2), color="lightgray", alpha=0.1) +  
        geom_point(data=PAGA.genes[!is.na(mgi_symbol) & !is.na(TpM), ][order(TpM)], aes(FA1, FA2, colour=log10(TpM)), alpha=0.2) +
  #      geom_point(data=pseudopool_matrix.zscore.PAGA[Coord==node, ], aes(FA1, FA2, colour=PSI, size=log(n_cells)), position = position_jitter(w = 2e3, h = 2e3), alpha=0.5 ) +
  
  facet_wrap(. ~ mgi_symbol, ncol=2) +
                theme_classic() +
     scale_colour_gradient2(low = "steelblue", midpoint = 2, mid = "lightskyblue3", high = "firebrick", na.value = "gray40", limits=c(0,4)) +
          theme(legend.position = "top", panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank())  +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(), strip.text.x = element_text(size = 12, face="bold")
        )


fig6.a <- ggplot() +
          geom_segment(data=edges, aes(x=FA1.x, y=FA2.x, xend = FA1.y, yend = FA2.y, size=value), colour="grey" ) + 

xlab("FoceAtlas1") +
  ylab("FoceAtlas2") +
                  theme_bw() +
    scale_size( range = c(0.01, 2)) +
        theme(legend.position = "top") +
    geom_text_repel(data = vert.names, colour="black", aes(FA1, FA2), size=2.7, 
    box.padding = unit(1, 'lines'),
     point.padding = 0.5,
    segment.size=0.2,
    max.overlaps=Inf,
    segment.linetype="dashed",
                label=vert.names$cell_type )  +
  
          geom_text(data=vert.names, aes(FA1, FA2, label=cluster, colour=Class ),

                    fontface='bold', size=4) 

fig6.a

library("ggrepel")

ggplot()+
  geom_point(data=total_diff, aes(-DeltaPsi.mean, Probability.mean), alpha=0.1, colour="grey" ) +
  geom_point(data=total_diff[ diff==TRUE, ], aes(-DeltaPsi.mean, Probability.mean, size=-log10(cdf.beta), color=Type), alpha=0.5) +
  ylab("Mean Probability") + 
   xlab("Mean dPSI") +
   # facet_grid(. ~ diff_name) +
  facet_wrap(~   diff_type + diff_name) +
  theme_bw() +
  scale_color_manual (values=gg_color_hue(9), drop=F) +
 theme(legend.position = "top")  +
  ylim(0.5, 1.25) +
  
#  geom_text_repel(data = total_diff[diff==TRUE &  toupper(mgi_symbol) %in% interesting_genes, ],
 #               colour="black", aes(-DeltaPsi.mean, Probability.mean), 
  #              nudge_y      = 0.07,
   #             direction    = "x",
    #            angle        = 90,
     #           vjust        = 1,
      #          segment.size = 0.1,
       #         max.overlaps  = Inf,
        #        label=total_diff[diff==TRUE &  toupper(mgi_symbol) %in% interesting_genes , mgi_symbol] ) 

  
  geom_text_repel(data = total_diff[diff==TRUE &  toupper(mgi_symbol) %in% splicing_regulation, ],
                colour="black", aes(-DeltaPsi.mean, Probability.mean), 
                nudge_y      = 0.07,
                direction    = "x",
                angle        = 90,
                vjust        = 1,
                segment.size = 0.1,
                label=total_diff[diff==TRUE &  toupper(mgi_symbol) %in% splicing_regulation , mgi_symbol] ) 
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiBzYXZlKFBBR0FfbmV0LAogICAgICBwc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQV9ncmFwaCwKICAgICAgcHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0EsCiAgICAgIHBzZXVkb3Bvb2xfbWF0cml4LlBBR0EsCiAgICAgIFBBR0EsCiAgICAgIGZpbGUgPSAnL2x1c3RyZS9zY3JhdGNoMTE3L2NlbGxnZW4vdGVhbTIxOC9ncDcvSm9lL0p1cHl0ZXIvUEFHQS5yZGEnKSAKCgpgYGAKCmBgYHtyfQpsb2FkKCIvbHVzdHJlL3NjcmF0Y2gxMTcvY2VsbGdlbi90ZWFtMjE4L2dwNy9Kb2UvSnVweXRlci9wc2V1ZG9wb29sX21hdHJpeF9kYXRhLnJkYSIpCmxvYWQoIi9sdXN0cmUvc2NyYXRjaDExNy9jZWxsZ2VuL3RlYW0yMTgvZ3A3L0pvZS9KdXB5dGVyL1BBR0EucmRhIikKYGBgCgoKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyZXBlbCkKYGBgCgpgYGB7cn0KdG90YWxfbm9kZV9yZWFkcyA8LSBwc2V1ZG9wb29sX21hdHJpeFsgLCAuKG5vZGVfcmVhZHM9c3VtKGFzLm51bWVyaWMoVG90YWxfUmVhZHMpLCBuYS5ybSA9IFQpKSwgYnk9IkNvb3JkIl0KCnRvdGFsX2RpZmYuaGlnaF9jb3YgPC0gbWVyZ2UodG90YWxfbm9kZV9yZWFkc1tub2RlX3JlYWRzPjIwMDAsIF0sIHRvdGFsX2RpZmZbIGRpZmY9PSJUUlVFIiwgXSwgYnk9IkNvb3JkIikKdG90YWxfZGlmZi5oaWdoX2NvdlsgLCAuKG1naV9zeW1ib2wsIENvb3JkLCBub2RlX3JlYWRzLCBOb2RlLCBUeXBlLCBkaWZmX25hbWUpIF1bb3JkZXIoQ29vcmQpXQpgYGAKCmBgYHtyfQoKYGBgCgoKYGBge3J9CmxpYnJhcnkodHNlcmllcykKClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkIDwtZGF0YS50YWJsZShQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCkKClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkW1ZhcjE9PScyMycgJiBWYXIyPT0nMCcsXQoKUEFHQV9ncmFwaF9jb25uZWN0aXZpdGllcyA8LSBmcmVhZCgiL2x1c3RyZS9zY3JhdGNoMTE3L2NlbGxnZW4vdGVhbTIxOC9ncDcvSm9lL1BBR0EiKQoKUEFHQV9ncmFwaF9jb25uZWN0aXZpdGllcyA8LSByZWFkLm1hdHJpeCgiL2x1c3RyZS9zY3JhdGNoMTE3L2NlbGxnZW4vdGVhbTIxOC9ncDcvSm9lL1BBR0EiLCBoZWFkZXIgPSBULCBzZXAgPSAiLCIpClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMgPC0gUEFHQV9ncmFwaF9jb25uZWN0aXZpdGllc1sgLDI6bmNvbChQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzKSBdCgpQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCA8LSBtZWx0KFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMpClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjEgPC0gYXMuY2hhcmFjdGVyKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjEpClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjIgPC0gYXMuY2hhcmFjdGVyKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjIpCgpQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCA8LSBkYXRhLnRhYmxlKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkKQoKUEFHQV9ncmFwaF9jb25uZWN0aXZpdGllcy5tZWx0ZWQkdmFsdWUgPC1hcy5udW1lcmljKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJHZhbHVlKQoKYGBgCgpgYGB7cn0Kc2F2ZSgvbHVzdHJlL3NjcmF0Y2gxMTcvY2VsbGdlbi90ZWFtMjE4L2dwNy9Kb2UvUEFHQS8pCmBgYAoKCmBgYHtyfQpQQUdBLm9sZCA8LSBmcmVhZCgiL2x1c3RyZS9zY3JhdGNoMTE3L2NlbGxnZW4vdGVhbTIxOC9ncDcvSm9lL1BBR0FfY29vcmRpbmF0ZXMuY3N2IikKUEFHQS5uZXcgPC0gZnJlYWQoIi9sdXN0cmUvc2NyYXRjaDExNy9jZWxsZ2VuL3RlYW0yMTgvZ3A3L0pvZS9QQUdBX2dyYXBoX3NpbmdsZV9jZWxsX2Nvb3JkaW5hdGVzLmNzdiIsIGhlYWRlcj1UKQoKUEFHQSA8LSBjYmluZChQQUdBLm9sZCwgUEFHQS5uZXdbICwgYygyLDMpXSkKClBBR0FbICxgOj1gKEZBMT1gMGAsRkEyPWAxYCApICBdCgpwYXRoX1BTSV9tYXRyaXhfZmlsZXMgPC0gIi9sdXN0cmUvc2NyYXRjaDExNy9jZWxsZ2VuL3RlYW0yMTgvZ3A3L0pvZS9NaWNyb0V4b25hdG9yL1doaXBwZXQvUXVhbnQvQ29sbGFwc2VkL05vX05BLyIKZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoPXBhdGhfUFNJX21hdHJpeF9maWxlcywgcGF0dGVybiA9ICIqcHNpLnRzdi5neiIgLCByZWN1cnNpdmUgPSBGKQoKcHNldWRvcG9vbF9tYXRyaXggPC0gcmJpbmRsaXN0KGxhcHBseShwYXN0ZTAocGF0aF9QU0lfbWF0cml4X2ZpbGVzLCBmaWxlcyksIGZyZWFkKSwgaWRjb2wgPSAib3JpZ2luIikKcHNldWRvcG9vbF9tYXRyaXggPC0gcHNldWRvcG9vbF9tYXRyaXhbU2FtcGxlIT0iU2FtcGxlIiwgVjE6PWJhc2VuYW1lKFNhbXBsZSldCnBzZXVkb3Bvb2xfbWF0cml4LlBBR0EgPC0gbWVyZ2UocHNldWRvcG9vbF9tYXRyaXgsIFBBR0EsIGJ5PSJWMSIpCgpwc2V1ZG9wb29sX21hdHJpeC5QQUdBWywgYDo9YChQU0k9YXMubnVtZXJpYyhQc2kpLCBTTl9SZWFkcz1hcy5udW1lcmljKFRvdGFsX1JlYWRzKSApXQoKYGBgCgoKYGBge3J9CmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKUEFHQS5uZXcKYGBgCgoKCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD03fQoKCgoKZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoZGF0YT1QQUdBLCBhZXMoRkExLCBGQTIpLCBjb2xvdXI9ImdyZXkiLCBhbHBoYT0wLjA1KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9N30KCgpub2RlID0gIjk6NjcwMjk2NjQtNjcwMjk3NDIiCgoKZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoZGF0YT1QQUdBLCBhZXMoRkExLCBGQTIpLCBjb2xvdXI9ImdyZXkiLCBhbHBoYT0wLjA1KSArCiAgZ2VvbV9wb2ludChkYXRhPXBzZXVkb3Bvb2xfbWF0cml4LlBBR0FbQ29vcmQ9PW5vZGUsIF0sIGFlcyhGQTEsIEZBMiwgY29sb3VyPVBTSSwgc2l6ZT1sb2coU05fUmVhZHMpICksIGFscGhhPTAuNSApICsKICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkcG9pbnQgPSAwLjUsIG1pZCA9ICJsaWdodHNreWJsdWUzIiwgaGlnaCA9ICJmaXJlYnJpY2siLCBuYS52YWx1ZSA9ICJncmF5NDAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCmBgYHtyfQpwc2V1ZG9fYnVsa19tZW1iZXJzaGlwIDwtIGZyZWFkKCIvbHVzdHJlL3NjcmF0Y2gxMTcvY2VsbGdlbi90ZWFtMjE4L2dwNy9Kb2UvTWljcm9FeG9uYXRvci9XaGlwcGV0L0hlYXRtYXAvUHNldWRvX2J1bGtzL3BzZXVkb19idWxrX21lbWJlcnNoaXAudHN2IikKcHNldWRvX2J1bGtfbWVtYmVyc2hpcC5tZWx0IDwtIHBzZXVkb19idWxrX21lbWJlcnNoaXBbLCBjKHNhbXBsZT1zdHJzcGxpdChzYW1wbGVzLCAiLCIpKSwgYnk9cHNldWRvX2J1bGtfSURdCmBgYAoKCgoKCmBgYHtyfQpwc2V1ZG9fYnVsa19tZW1iZXJzaGlwIDwtIGZyZWFkKCIvbHVzdHJlL3NjcmF0Y2gxMTcvY2VsbGdlbi90ZWFtMjE4L2dwNy9Kb2UvTWljcm9FeG9uYXRvci9XaGlwcGV0L0hlYXRtYXAvUHNldWRvX2J1bGtzL3BzZXVkb19idWxrX21lbWJlcnNoaXAudHN2IikKcHNldWRvX2J1bGtfbWVtYmVyc2hpcC5tZWx0IDwtIHBzZXVkb19idWxrX21lbWJlcnNoaXBbLCBjKHNhbXBsZT1zdHJzcGxpdChzYW1wbGVzLCAiLCIpKSwgYnk9cHNldWRvX2J1bGtfSURdCgpwc2V1ZG9wb29sX21hdHJpeC5QQUdBLnBzZXVkb3Bvb2wgPC0gIG1lcmdlKHBzZXVkb19idWxrX21lbWJlcnNoaXAubWVsdCwgUEFHQSwgYnkueD0ic2FtcGxlIiwgYnkueT0iVjEiKQoKCnBzZXVkb3Bvb2xfbWF0cml4LlBBR0EucHNldWRvcG9vbC5zdGF0cyA8LSBwc2V1ZG9wb29sX21hdHJpeC5QQUdBLnBzZXVkb3Bvb2xbICwgLihGQTE9bWVhbihGQTEsICBybS5uYT1UKSwgRkEyPW1lYW4oRkEyLCBybS5uYT1UKSApLCBieT0icHNldWRvX2J1bGtfSUQiIF0KCgpwc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQSA8LSBtZXJnZShwc2V1ZG9wb29sX21hdHJpeC56c2NvcmUsIHBzZXVkb3Bvb2xfbWF0cml4LlBBR0EucHNldWRvcG9vbC5zdGF0cywgYnkueD0icG9vbF9JRCIsIGJ5Lnk9InBzZXVkb19idWxrX0lEIikKYGBgCgpgYGB7cn0KcHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0Euc3RhdHMgPC0gcHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0FbQ29vcmQ9PW5vZGUsICAuKFBTST1tZWFuKFBTSSwgcm0ubmE9VCkpICwgYnk9YygiY2x1c3RlciIsICJDb29yZCIpXQpgYGAKCmBgYHtyfQpQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCR2YWx1ZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCR2YWx1ZSkpCgpQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZFt2YWx1ZT09MCwgXQoKaXMuZGF0YS50YWJsZShQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCkKYGBgCgpgYGB7cn0Kbm9kZT0iMTU6NzcwOTE4MTItNzcwOTE4NTQiCmBgYAoKCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD03fQpwc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQQoKcHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0FbICwgYDo9YChuX2NlbGxzPS5OLCBTTl9SZWFkcz1zdW0oYXMubnVtZXJpYyhUb3RhbF9SZWFkcykpLCBybS5uYT1UKSwgYnk9InBvb2xfSUQiXQoKcHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0FbLCBgOj1gKFBTST1hcy5udW1lcmljKFBzaSkgICldCgoKCgp2ZXJ0IDwtIHBzZXVkb3Bvb2xfbWF0cml4LnpzY29yZS5QQUdBW0Nvb3JkPT1ub2RlLCAgLihGQTE9bWVhbihGQTEsIHJtLm5hPVQpLCBGQTI9bWVhbihGQTIsIHJtLm5hPVQpKSAsIGJ5PWMoImNsdXN0ZXIiLCAiQ29vcmQiKV0KCgoKZWRnZXMgPC0gbWVyZ2UoUEFHQV9uZXRbICwgLihWYXIxPWFzLmNoYXJhY3RlcihWYXIxKSwgVmFyMj1hcy5jaGFyYWN0ZXIoVmFyMiksIHZhbHVlKV0sIHZlcnQsIGJ5Lng9J1ZhcjEnLCBieS55PSdjbHVzdGVyJykKZWRnZXMgPC0gbWVyZ2UoZWRnZXMsIHZlcnQsIGJ5Lng9J1ZhcjInLCBieS55PSdjbHVzdGVyJykKCgoKCmdncGxvdCgpICsKICAKICAgICAgICBnZW9tX3BvaW50KGRhdGE9dmVydCwgYWVzKEZBMSwgRkEyKSkgKwogIAogICAgICAgIGdlb21fc2VnbWVudChkYXRhPWVkZ2VzLCBhZXMoeD1GQTEueCwgeT1GQTIueCwgeGVuZCA9IEZBMS55LCB5ZW5kID0gRkEyLnksIHNpemU9dmFsdWUpLCBjb2xvdXI9ImdyZXkiICkgKyAKICAgICAgICBnZW9tX3BvaW50KGRhdGE9cHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0FbQ29vcmQ9PW5vZGUsIF0sIGFlcyhGQTEsIEZBMiwgY29sb3VyPVBTSSwgc2l6ZT1sb2cobl9jZWxscykpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMmUzLCBoID0gMmUzKSwgYWxwaGE9MC41ICkgKwogICAgICAgICAgICAgICAgdGhlbWVfYncoKSArCiAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkcG9pbnQgPSAwLjUsIG1pZCA9ICJsaWdodHNreWJsdWUzIiwgaGlnaCA9ICJmaXJlYnJpY2siLCBuYS52YWx1ZSA9ICJncmF5NDAiKSArCiAgICBzY2FsZV9zaXplKCByYW5nZSA9IGMoMC4wMSwgNCkpICsKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCgoKCmBgYAoKCgoKYGBge3J9CgoKY29sbmFtZXMoUEFHQV9ncmFwaF9jb25uZWN0aXZpdGllcy5tZWx0ZWQpIDwtIGMoIlZhcjEiLCAiVmFyMiIsICJ2YWx1ZSIpClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjEgPC0gc3RyKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjEpClBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjIgPC0gc3RyKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjIpCgpQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZCRWYXIyIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFBBR0FfZ3JhcGhfY29ubmVjdGl2aXRpZXMubWVsdGVkJFZhcjIgKSkKCgpQQUdBX25ldCA8LSBtZXJnZShQQUdBX2dyYXBoX2Nvbm5lY3Rpdml0aWVzLm1lbHRlZFt2YWx1ZT4wLjA1IF0sIFBBR0FfZ3JhcGhfcG9zaXRpb24sIGJ5Lng9J1ZhcjEnLCBieS55PSdjbHVzdGVyJykKUEFHQV9uZXQgPC0gbWVyZ2UoUEFHQV9uZXQsIFBBR0FfZ3JhcGhfcG9zaXRpb24sIGJ5Lng9J1ZhcjInLCBieS55PSdjbHVzdGVyJykKCgpwc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQV9ncmFwaCA8LSBtZXJnZSggIHBzZXVkb3Bvb2xfbWF0cml4LnpzY29yZSwgIFBBR0FfZ3JhcGhfcG9zaXRpb25bICwgLihjbHVzdGVyPWFzLmNoYXJhY3RlcihjbHVzdGVyKSwgYDBgLCBgMWAgKV0sIGJ5PSJjbHVzdGVyIikKCnBzZXVkb3Bvb2xfbWF0cml4LnpzY29yZS5QQUdBX2dyYXBoWyAsIGA6PWAobl9jZWxscz0uTiwgU05fUmVhZHM9c3VtKGFzLm51bWVyaWMoVG90YWxfUmVhZHMpKSwgcm0ubmE9VCksIGJ5PSJwb29sX0lEIl0KcHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0FfZ3JhcGhbLCBgOj1gKFBTST1hcy5udW1lcmljKFBzaSkgICldCiAKYGBgCgpgYGB7cn0KUEFHQV9uZXQKYGBgCgoKYGBge3J9CmVkZ2VzWyAgVmFyMj09MCAmIFZhcjE9PTIzLCBdCgpgYGAKCgoKYGBge3J9CgoKbm9kZSA9ICI5OjY3MDI5NjY0LTY3MDI5NzQyIgoKCgoKZ2dwbG90KCkgKwogICAgIGdlb21fc2VnbWVudChkYXRhPVBBR0FfbmV0LCBhZXMoeD1gMC54YCwgeT1gMS54YCwgeGVuZCA9IGAwLnlgLCB5ZW5kID0gYDEueWAsIHNpemU9dmFsdWUpLCBjb2xvdXI9ImdyZXkiICkgKyAKICBnZW9tX3BvaW50KGRhdGE9cHNldWRvcG9vbF9tYXRyaXguenNjb3JlLlBBR0FfZ3JhcGhbQ29vcmQ9PW5vZGUsIF0sIGFlcyhgMGAsIGAxYCwgY29sb3VyPVBTSSwgc2l6ZT1sb2cobl9jZWxscykpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMC4yLCBoID0gMC4yKSwgYWxwaGE9MC41ICkgKwogICNnZW9tX3RleHQoZGF0YT1QQUdBX2dyYXBoX3Bvc2l0aW9uLCBhZXMoYDBgLCBgMWAsIGxhYmVsPWNsdXN0ZXIpKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkcG9pbnQgPSAwLjUsIG1pZCA9ICJsaWdodHNreWJsdWUzIiwgaGlnaCA9ICJmaXJlYnJpY2siLCBuYS52YWx1ZSA9ICJncmF5NDAiKSArIAogIHNjYWxlX3NpemUoIHJhbmdlID0gYygwLjAxLCA0KSkgKwogICAgIHRoZW1lX2J3KCkgCmBgYAoKCgoKYGBge3J9CmxpYnJhcnkoaWdyYXBoKQoKZyA9IHJlYWQuZ3JhcGgoImEtbmV0d29yay5nbWwiLCBmb3JtYXQ9ImdtbCIpCgojZ2V0IHRoZSBub2RlIGNvb3JkaW5hdGVzCnBsb3Rjb3JkIDwtIGRhdGEuZnJhbWUobGF5b3V0LmZydWNodGVybWFuLnJlaW5nb2xkKGcpKQpjb2xuYW1lcyhwbG90Y29yZCkgPSBjKCJYMSIsIlgyIikKCiNnZXQgZWRnZXMsIHdoaWNoIGFyZSBwYWlycyBvZiBub2RlIElEcwplZGdlbGlzdCA8LSBnZXQuZWRnZWxpc3QoZykKCiNjb252ZXJ0IHRvIGEgZm91ciBjb2x1bW4gZWRnZSBkYXRhIGZyYW1lIHdpdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb29yZGluYXRlcwplZGdlcyA8LSBkYXRhLmZyYW1lKHBsb3Rjb3JkW2VkZ2VsaXN0WywxXSxdLCBwbG90Y29yZFtlZGdlbGlzdFssMl0sXSkKY29sbmFtZXMoZWRnZXMpIDwtIGMoIlgxIiwiWTEiLCJYMiIsIlkyIikKCmdncGxvdCgpICsgZ2VvbV9zZWdtZW50KGFlcyh4PVgxLCB5PVkxLCB4ZW5kID0gWDIsIHllbmQgPSBZMiksIGRhdGE9ZWRnZXMsIHNpemUgPSAwLjUsIGNvbG91cj0iZ3JleSIpICsgZ2VvbV9wb2ludChhZXMoWDEsIFgyKSwgZGF0YT1wbG90Y29yZCkKYGBgCgoKIyMjIyBHZW5lcmFsIHZpZXcKCgpgYGB7cn0KCmdncGxvdChwc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQVtDb29yZD09bm9kZSwgXSkgKwogICAgICAgIGdlb21fcG9pbnQoYWVzKEZBMSwgRkEyLCBjb2xvdXI9Y2x1c3Rlciwgc2l6ZT1sb2cobl9jZWxscykpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gM2UzLCBoID0gM2UzKSwgYWxwaGE9MC41ICkgKwogICAgICAgICAgICAgICAgdGhlbWVfYncoKSArCiAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93ID0gInN0ZWVsYmx1ZSIsIG1pZHBvaW50ID0gMC41LCBtaWQgPSAibGlnaHRza3libHVlMyIsIGhpZ2ggPSAiZmlyZWJyaWNrIiwgbmEudmFsdWUgPSAiZ3JheTQwIikgKwogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCmBgYAoKCgpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9N30KbGlicmFyeSgiZ2dyZXBlbCIpCgpnZ3Bsb3QoKSArCiAgCiAgICAgICAgZ2VvbV9wb2ludChkYXRhPVBBR0EsIGFlcyhGQTEsIEZBMiwgY29sb3VyPWJhdGNoKSwgYWxwaGE9MC4yKSArCiAgIyAgICAgIGdlb21fcG9pbnQoZGF0YT1wc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQVtDb29yZD09bm9kZSwgXSwgYWVzKEZBMSwgRkEyLCBjb2xvdXI9UFNJLCBzaXplPWxvZyhuX2NlbGxzKSksIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHcgPSAyZTMsIGggPSAyZTMpLCBhbHBoYT0wLjUgKSArCiAgICAgICAgICAgICAgICB0aGVtZV9idygpICsKICAjICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkcG9pbnQgPSAwLjUsIG1pZCA9ICJsaWdodHNreWJsdWUzIiwgaGlnaCA9ICJmaXJlYnJpY2siLCBuYS52YWx1ZSA9ICJncmF5NDAiKSArCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpIApgYGAKCmBgYHtyfQpnZW5lX2NvdW50IDwtIGZyZWFkKCd+L1ZBU0EvZ2VuZV9UTVAuM3JlYWRfY291bnQudHh0JykKdG90YWxfZ2VuZXMgPC0gdW5pcXVlKGdlbmVfY291bnQkR2VuZSkKCnRvdGFsX2dlbmVzLmdlbmVfdGFibGUgPC0gZGF0YS50YWJsZShnZXRCTShhdHRyaWJ1dGVzPWMoJ2Vuc2VtYmxfZ2VuZV9pZCcsICJtZ2lfc3ltYm9sIiksZmlsdGVycyA9ICdlbnNlbWJsX2dlbmVfaWQnLCB2YWx1ZXMgPSB0b3RhbF9nZW5lcyAsIG1hcnQgPSBlbnNlbWJsX21tKSkKCmdlbmVfY291bnQgPC0gbWVyZ2UoZ2VuZV9jb3VudCwgdG90YWxfZ2VuZXMuZ2VuZV90YWJsZSwgYnkueD0iR2VuZSIsIGJ5Lnk9ImVuc2VtYmxfZ2VuZV9pZCIpCgp0b3RhbF9nZW5lcy5nZW5lX3RhYmxlWyBtZ2lfc3ltYm9sICVpbiUgYyggIlJiZm94MiIsICJNYm5sMSIsICJNYm5sMiIsICJQdGJwMSIsICJQdGJwMiIsICJOb3ZhMSIsICJEbm10M2IiLCAiQ2FtazJhIiksIF0KCgpgYGAKCgoKYGBge3J9CnRvdGFsX2dlbmVzLmdlbmVfdGFibGVbIG1naV9zeW1ib2wgJWluJSBjKCAiUmJmb3gyIiwgIk1ibmwxIiwgIk1ibmwyIiwgIlB0YnAxIiwgIlB0YnAyIiwgIk5vdmExIiwgIkRubXQzYiIsICJDYW1rMmEiLCAiUWtpIiwgIkhucm5wYyIsICJIbnJucGYiLCAiRXNwcjEiKSwgXQpgYGAKCmBgYHtyfQp0b3RhbF9nZW5lcy5nZW5lX3RhYmxlWyAgdG91cHBlcihtZ2lfc3ltYm9sKSAgICVpbiUgUkJQX2Fubm90YXRpb25bYFNwbGljaW5nIHJlZ3VsYXRpb25gPT0xXSQuLi4xXQp0b3RhbF9nZW5lcy5nZW5lX3RhYmxlWyAgbWdpX3N5bWJvbD09IlNycm00IiwgXQoKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTYsIGZpZy53aWR0aD0xMH0KI0dvb2QKI0VsYXZsMgojTXNpMQoKI0JhZAojUHRicDIKCmdlbmVfdmVjdG9yIDwtIGMoIk1ibmwxIiwgIkVsYXZsMiIsICJSYmZveDIiLCAiUmJtMjQiLCAiTXNpMSIsICJFc3JwMSIpCiNnZW5lX3ZlY3RvciA8LSBjKCJFbGF2bDIiLCAiQ2VsZjQiLCAiTXNpMSIsICJTcnJtNCIsICJFbGF2bDMiLCAiRWxhdmwxIikKCgojZ2VuZV92ZWN0b3IgPC0gYygiTWJubDEiLCAiUHRicDIiLCAiUmJmb3gyIiwgIlJibTI0IiwgIlB0YnAzIiwgIkVzcnAxIikKClBBR0EuZ2VuZXMgPC0gbWVyZ2UoIGdlbmVfY291bnRbbWdpX3N5bWJvbCAlaW4lICBnZW5lX3ZlY3RvcixdICwgUEFHQVsgLC4oY2VsbD1WMSwgRkExLCBGQTIpXSwgYnk9ImNlbGwiLCBhbGwueT1UICApCgojUEFHQS5nZW5lcyRjZWxsIDwtIGZhY3RvciggUEFHQS5nZW5lcyRjZWxsLCBsZXZlbHM9IFBBR0EuZ2VuZXNbb3JkZXIoVHBNKV0kY2VsbCkKCgpnZ3Bsb3QoKSArCiAgICAgICAgZ2VvbV9wb2ludChkYXRhPVBBR0EsIGFlcyhGQTEsIEZBMiksIGNvbG9yPSJsaWdodGdyYXkiLCBhbHBoYT0wLjEpICsgIAogICAgICAgIGdlb21fcG9pbnQoZGF0YT1QQUdBLmdlbmVzWyFpcy5uYShtZ2lfc3ltYm9sKSAmICFpcy5uYShUcE0pLCBdW29yZGVyKFRwTSldLCBhZXMoRkExLCBGQTIsIGNvbG91cj1sb2cxMChUcE0pKSwgYWxwaGE9MC4yKSArCiAgIyAgICAgIGdlb21fcG9pbnQoZGF0YT1wc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQVtDb29yZD09bm9kZSwgXSwgYWVzKEZBMSwgRkEyLCBjb2xvdXI9UFNJLCBzaXplPWxvZyhuX2NlbGxzKSksIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHcgPSAyZTMsIGggPSAyZTMpLCBhbHBoYT0wLjUgKSArCiAgCiAgZmFjZXRfd3JhcCguIH4gbWdpX3N5bWJvbCwgbmNvbD0yKSArCiAgICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93ID0gInN0ZWVsYmx1ZSIsIG1pZHBvaW50ID0gMiwgbWlkID0gImxpZ2h0c2t5Ymx1ZTMiLCBoaWdoID0gImZpcmVicmljayIsIG5hLnZhbHVlID0gImdyYXk0MCIsIGxpbWl0cz1jKDAsNCkpICsKICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSAgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZT0iYm9sZCIpCiAgICAgICAgKQpgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTMwLCBmaWcud2lkdGg9MzB9CgojTWJubDEgRU5TTVVTRzAwMDAwMDI3NzYzCiNQdGJwMiBFTlNNVVNHMDAwMDAwMjgxMzQKI1JiZm94MiBFTlNNVVNHMDAwMDAwMzM1NjUKI0hucm5wbGwgRU5TTVVTRzAwMDAwMDI0MDk1CiNQdGJwMyBFTlNNVVNHMDAwMDAwMjgzODIKCgpQQUdBLmdlbmVzIDwtIG1lcmdlKCBnZW5lX2NvdW50WyB0b3VwcGVyKG1naV9zeW1ib2wpICAgJWluJSBSQlBfYW5ub3RhdGlvbltgU3BsaWNpbmcgcmVndWxhdGlvbmA9PTFdJC4uLjEsXSAsIFBBR0FbICwuKGNlbGw9VjEsIEZBMSwgRkEyKV0sIGJ5PSJjZWxsIiwgYWxsLnk9RiAgKQoKI1BBR0EuZ2VuZXMkY2VsbCA8LSBmYWN0b3IoIFBBR0EuZ2VuZXMkY2VsbCwgbGV2ZWxzPSBQQUdBLmdlbmVzW29yZGVyKFRwTSldJGNlbGwpCgoKZ2dwbG90KCkgKwogICAgICAgIGdlb21fcG9pbnQoZGF0YT1QQUdBLmdlbmVzW2lzLm5hKFRwTSksIF0sIGFlcyhGQTEsIEZBMiksIGNvbG9yPSJsaWdodGdyYXkiLCBhbHBoYT0wLjEpICsgIAogICAgICAgIGdlb21fcG9pbnQoZGF0YT1QQUdBLmdlbmVzWyFpcy5uYShUcE0pLCBdW29yZGVyKFRwTSldLCBhZXMoRkExLCBGQTIsIGNvbG91cj1sb2cxMChUcE0pKSwgYWxwaGE9MC4yKSArCiAgIyAgICAgIGdlb21fcG9pbnQoZGF0YT1wc2V1ZG9wb29sX21hdHJpeC56c2NvcmUuUEFHQVtDb29yZD09bm9kZSwgXSwgYWVzKEZBMSwgRkEyLCBjb2xvdXI9UFNJLCBzaXplPWxvZyhuX2NlbGxzKSksIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHcgPSAyZTMsIGggPSAyZTMpLCBhbHBoYT0wLjUgKSArCiAgCiAgZmFjZXRfd3JhcCguIH4gbWdpX3N5bWJvbCwgbmNvbD0xMCkgKwogICAgICAgICAgICAgICAgdGhlbWVfYncoKSArCiAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkcG9pbnQgPSAyLCBtaWQgPSAibGlnaHRza3libHVlMyIsIGhpZ2ggPSAiZmlyZWJyaWNrIiwgbmEudmFsdWUgPSAiZ3JheTQwIiwgbGltaXRzPWMoMCw0KSkgKwogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCgoKYGBge3J9CmNlbGxfYW5ub3RhdGlvbnMuYW5uYSA8LSAgZnJlYWQoIi9sdXN0cmUvc2NyYXRjaDExNy9jZWxsZ2VuL3RlYW0yMTgvZ3A3L0pvZS9NaWNyb0V4b25hdG9yL3VtYXBfTm9SZWdyZXNzZWRBbm5vdGF0aW9ucy50c3YiKQpoZWFkKGNlbGxfYW5ub3RhdGlvbnMuYW5uYSkKYGBgCgoKCgpgYGB7cn0KY2x1c3Rlcl9uYW1lcyA8LSBmcmVhZCgiL2x1c3RyZS9zY3JhdGNoMTE3L2NlbGxnZW4vdGVhbTIxOC9ncDcvSm9lL0p1cHl0ZXIvY2x1c3Rlcl9uYW1lcy50dnMiKQpjbHVzdGVyX25hbWVzJGNsdXN0ZXIgPC0gYXMuY2hhcmFjdGVyKGNsdXN0ZXJfbmFtZXMkY2x1c3RlcikgCgp2ZXJ0Lm5hbWVzIDwtIG1lcmdlKHZlcnQsIGNsdXN0ZXJfbmFtZXMsIGJ5PSJjbHVzdGVyIikKCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTl9CgoKICAgIAoKZ2dwbG90KCkgKwogIAogICAgZ2VvbV9wb2ludChkYXRhPXBzZXVkb3Bvb2xfbWF0cml4LnpzY29yZS5QQUdBW0Nvb3JkPT1ub2RlLCBdLCBhZXMoRkExLCBGQTIsIHNpemU9bG9nKG5fY2VsbHMpLCBjb2xvcj1jbHVzdGVyKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIodyA9IDNlMywgaCA9IDNlMyksIGFscGhhPTAuNSApICsgIAogICAgICAgICAgZ2VvbV9zZWdtZW50KGRhdGE9ZWRnZXMsIGFlcyh4PUZBMS54LCB5PUZBMi54LCB4ZW5kID0gRkExLnksIHllbmQgPSBGQTIueSwgc2l6ZT12YWx1ZSksIGNvbG91cj0iZ3JleSIgKSArIAoKeGxhYigiRm9jZUF0bGFzMSIpICsKICB5bGFiKCJGb2NlQXRsYXMyIikgKwogICAgICAgICAgICAgICAgICB0aGVtZV9idygpICsKICAgIHNjYWxlX3NpemUoIHJhbmdlID0gYygwLjAxLCA0KSkgKwogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIAogICAgICAgICAgICBnZW9tX3RleHQoZGF0YT12ZXJ0Lm5hbWVzLCBhZXMoRkExLCBGQTIsIGxhYmVsPWNsdXN0ZXIsICksZm9udGZhY2U9J2JvbGQnLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT01KSAgKwogICAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSB2ZXJ0Lm5hbWVzLCBjb2xvdXI9ImJsYWNrIiwgYWVzKEZBMSwgRkEyKSwgCiAgICBib3gucGFkZGluZyA9IHVuaXQoMC44LCAnbGluZXMnKSwKICAgIHBvaW50LnBhZGRpbmcgPSAwLjgsCiAgICBzaXplID00LjUsIAogICAgICAgICAgICAgICAgbGFiZWw9dmVydC5uYW1lcyRjZWxsX3R5cGUgKSAgCiAgCgpgYGAKCgpgYGB7cn0KCgp2ZXJ0Lm5hbWVzW2NsdXN0ZXIgJWluJSBjKCIzNCIsICIzMiIsICIyNyIsICIyOCIsICIzMiIpLCBDbGFzczo9IkNhcmRpYWMiXQp2ZXJ0Lm5hbWVzW2NsdXN0ZXIgJWluJSBjKCIyMyIsICIwIiwgIjIzIiwgIjM2IiwgIjM5IiApICwgIENsYXNzOj0iRXJ5dGhyb2lkIl0KdmVydC5uYW1lc1tjbHVzdGVyICVpbiUgYygiNiIsICIxMyIsICIzMCIpLCAgQ2xhc3M6PSJTcGluYWwgQ29vcmQiXQp2ZXJ0Lm5hbWVzW2NsdXN0ZXIgJWluJSBjKCI5IiwgIjEwIiwgIjEyIiApLCAgQ2xhc3M6PSJCcmFpbiJdCnZlcnQubmFtZXNbY2x1c3RlciAlaW4lIGMoIjE0IiwgIjIxIiApLCAgQ2xhc3M6PSJOZXVyYWwgY3Jlc3QiXQp2ZXJ0Lm5hbWVzW2NsdXN0ZXIgJWluJSBjKCI0IiwgIjExIiwgIjE4IiwgIjI0IiwgIjI5IiAgICksICBDbGFzczo9IkVwaWJsYXN0Il0KdmVydC5uYW1lc1tjbHVzdGVyICVpbiUgYygiMTkiICksICBDbGFzczo9IkV4dHJhIGVtYnJ5b25pYyJdCnZlcnQubmFtZXNbY2x1c3RlciAlaW4lIGMoIjMiLCAiNSIsICIzNSIpLCBDbGFzczo9Ik1lc29kZXJtIl0KdmVydC5uYW1lc1tjbHVzdGVyICVpbiUgYygiMjUiKSwgQ2xhc3M6PSJFbmRvZGVybSJdCgp2ZXJ0Lm5hbWVzWyAgaXMubmEoQ2xhc3MpLCBDbGFzczo9Ik90aGVyIl0KYGBgCgoKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KCmZpZzYuYSA8LSBnZ3Bsb3QoKSArCiAgICAgICAgICBnZW9tX3NlZ21lbnQoZGF0YT1lZGdlcywgYWVzKHg9RkExLngsIHk9RkEyLngsIHhlbmQgPSBGQTEueSwgeWVuZCA9IEZBMi55LCBzaXplPXZhbHVlKSwgY29sb3VyPSJncmV5IiApICsgCgp4bGFiKCJGb2NlQXRsYXMxIikgKwogIHlsYWIoIkZvY2VBdGxhczIiKSArCiAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkgKwogICAgc2NhbGVfc2l6ZSggcmFuZ2UgPSBjKDAuMDEsIDIpKSArCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICAgIGdlb21fdGV4dF9yZXBlbChkYXRhID0gdmVydC5uYW1lcywgY29sb3VyPSJibGFjayIsIGFlcyhGQTEsIEZBMiksIHNpemU9Mi43LCAKICAgIGJveC5wYWRkaW5nID0gdW5pdCgxLCAnbGluZXMnKSwKICAgICBwb2ludC5wYWRkaW5nID0gMC41LAogICAgc2VnbWVudC5zaXplPTAuMiwKICAgIG1heC5vdmVybGFwcz1JbmYsCiAgICBzZWdtZW50LmxpbmV0eXBlPSJkYXNoZWQiLAogICAgICAgICAgICAgICAgbGFiZWw9dmVydC5uYW1lcyRjZWxsX3R5cGUgKSAgKwogIAogICAgICAgICAgZ2VvbV90ZXh0KGRhdGE9dmVydC5uYW1lcywgYWVzKEZBMSwgRkEyLCBsYWJlbD1jbHVzdGVyLCBjb2xvdXI9Q2xhc3MgKSwKCgogICAgICAgICAgICAgICAgICAgIGZvbnRmYWNlPSdib2xkJywgc2l6ZT00KSAKCmZpZzYuYQpgYGAKCgoKCgpgYGB7cn0KbGlicmFyeSgiZ2dyZXBlbCIpCgpnZ3Bsb3QoKSsKICBnZW9tX3BvaW50KGRhdGE9dG90YWxfZGlmZiwgYWVzKC1EZWx0YVBzaS5tZWFuLCBQcm9iYWJpbGl0eS5tZWFuKSwgYWxwaGE9MC4xLCBjb2xvdXI9ImdyZXkiICkgKwogIGdlb21fcG9pbnQoZGF0YT10b3RhbF9kaWZmWyBkaWZmPT1UUlVFLCBdLCBhZXMoLURlbHRhUHNpLm1lYW4sIFByb2JhYmlsaXR5Lm1lYW4sIHNpemU9LWxvZzEwKGNkZi5iZXRhKSwgY29sb3I9VHlwZSksIGFscGhhPTAuNSkgKwogIHlsYWIoIk1lYW4gUHJvYmFiaWxpdHkiKSArIAogICB4bGFiKCJNZWFuIGRQU0kiKSArCiAgICMgZmFjZXRfZ3JpZCguIH4gZGlmZl9uYW1lKSArCiAgZmFjZXRfd3JhcCh+ICAgZGlmZl90eXBlICsgZGlmZl9uYW1lKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsICh2YWx1ZXM9Z2dfY29sb3JfaHVlKDkpLCBkcm9wPUYpICsKIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAgKwogIHlsaW0oMC41LCAxLjI1KSArCiAgCiMgIGdlb21fdGV4dF9yZXBlbChkYXRhID0gdG90YWxfZGlmZltkaWZmPT1UUlVFICYgIHRvdXBwZXIobWdpX3N5bWJvbCkgJWluJSBpbnRlcmVzdGluZ19nZW5lcywgXSwKICMgICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIiwgYWVzKC1EZWx0YVBzaS5tZWFuLCBQcm9iYWJpbGl0eS5tZWFuKSwgCiAgIyAgICAgICAgICAgICAgbnVkZ2VfeSAgICAgID0gMC4wNywKICAgIyAgICAgICAgICAgICBkaXJlY3Rpb24gICAgPSAieCIsCiAgICAjICAgICAgICAgICAgYW5nbGUgICAgICAgID0gOTAsCiAgICAgIyAgICAgICAgICAgdmp1c3QgICAgICAgID0gMSwKICAgICAgIyAgICAgICAgICBzZWdtZW50LnNpemUgPSAwLjEsCiAgICAgICAjICAgICAgICAgbWF4Lm92ZXJsYXBzICA9IEluZiwKICAgICAgICAjICAgICAgICBsYWJlbD10b3RhbF9kaWZmW2RpZmY9PVRSVUUgJiAgdG91cHBlcihtZ2lfc3ltYm9sKSAlaW4lIGludGVyZXN0aW5nX2dlbmVzICwgbWdpX3N5bWJvbF0gKSAKCiAgCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSB0b3RhbF9kaWZmW2RpZmY9PVRSVUUgJiAgdG91cHBlcihtZ2lfc3ltYm9sKSAlaW4lIHNwbGljaW5nX3JlZ3VsYXRpb24sIF0sCiAgICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIiwgYWVzKC1EZWx0YVBzaS5tZWFuLCBQcm9iYWJpbGl0eS5tZWFuKSwgCiAgICAgICAgICAgICAgICBudWRnZV95ICAgICAgPSAwLjA3LAogICAgICAgICAgICAgICAgZGlyZWN0aW9uICAgID0gIngiLAogICAgICAgICAgICAgICAgYW5nbGUgICAgICAgID0gOTAsCiAgICAgICAgICAgICAgICB2anVzdCAgICAgICAgPSAxLAogICAgICAgICAgICAgICAgc2VnbWVudC5zaXplID0gMC4xLAogICAgICAgICAgICAgICAgbGFiZWw9dG90YWxfZGlmZltkaWZmPT1UUlVFICYgIHRvdXBwZXIobWdpX3N5bWJvbCkgJWluJSBzcGxpY2luZ19yZWd1bGF0aW9uICwgbWdpX3N5bWJvbF0gKSAKYGBgCgo=